package utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import datensaetze.Analysator;
import datensaetze.Datensatz;
import datensaetze.Feld;






public class SchlagwortUtils {

	private static boolean logEnabled = false;

	public static void setLogEnabled(boolean logEnabled) {
		SchlagwortUtils.logEnabled = logEnabled;
	}

	private static String[] tagsToLog = new String[0];

	public static void setTagsToLog(String... tagsToLog) {
		if (tagsToLog == null)
			SchlagwortUtils.tagsToLog = new String[0];
		else
			SchlagwortUtils.tagsToLog = tagsToLog;
	}

	public static void setTagsToLog(int... tagsToLog) {
		SchlagwortUtils.tagsToLog = SchlagwortUtils.ints2strings(tagsToLog);
	}

	public static void logErrorInDatensatz(String tag, Feld feld) {

		if (!logEnabled)
			return;

		try {
			File logfolder = new File("log");
			logfolder.mkdir();
			File logfile = new File("log/logfileDatensatz.txt");
			final boolean append = true;

			FileOutputStream logOS = new FileOutputStream(logfile, append);

			PrintStream log = new PrintStream(logOS);
			Datensatz ds = feld.getDatensatz();
			log.print("Fehler in idn=" + ds.getIdn() + "\tTag=" + tag);
			for (String furtherTag : tagsToLog) {
				String s = "\t";
				Feld f = ds.getFeld(furtherTag);
				if (f == null)
					s += "null";
				else
					s += f.toString();
				log.print(s);
			}
			log.println();
		} catch (Exception e1) {
			// Gefährlich, aber wohl sinnvoll, da nur ein Logversuch
			// in nicht allzu wichtigen Situationen.
			e1.printStackTrace();
		}
	}

	static HashMap<String, Analysator> analysators = null;

	private static void initializeAnalysators() {
		if (analysators != null)
			return;
		analysators = new HashMap<String, Analysator>();

		

	}

	private static void inizializeWithAnalysator(Analysator an) {
		analysators.put(an.getMainTag(), an);
	}

	/**
	 * Liefert eine Map zur Weiterverarbeitung in GNDRecordFactory.
	 * @param tags	bekannte Tags. Wenn TagDB unbekannt, wird eine 
	 * 			IllegalArgumentException geworfen.
	 * @return
	 * @throws IllegalArgumentException
	 */
	public static
			Map<String, Analysator>
			getAnalysatorMapFor(String... tags) {
		if (analysators == null)
			initializeAnalysators();
		Map<String, Analysator> map = new HashMap<String, Analysator>();
		for (String tag : tags) {
			Analysator an = analysators.get(tag);
			if (an == null)
				throw new IllegalArgumentException();
			an.anmelden(map);
		}
		return map;

	}

	public static String[] ints2strings(int[] intarr) {
		if (intarr == null)
			return new String[0];
		String[] ss = new String[intarr.length];
		for (int i = 0; i < intarr.length; i++) {
			ss[i] = intarr[i] + "";
		}
		return ss;
	}

	public static Map<String, Analysator> getAnalysatorMapFor(int... tags) {
		return getAnalysatorMapFor(ints2strings(tags));
	}

	public static Map<String, Analysator> getAnalysatorMap800() {
		return getAnalysatorMapFor("800");
	}

	public static Map<String, Analysator> getAnalysatorMap800830() {
		return getAnalysatorMapFor("800", "830");
	}

	public static Map<String, Analysator> getAllAnalysators() {
		initializeAnalysators();
		Map<String, Analysator> map = new HashMap<String, Analysator>();
		for (Analysator analysator : analysators.values()) {

			analysator.anmelden(map);
		}
		return map;
	}

	/**
	 * Liefert eine eventuell leere Liste von Feldern.
	 * 
	 * @param ds	Datensatz nicht null.
	 * @param tags
	 * @return
	 */
	public static List<Feld> extrahiereFelderAusDatensatz(
			Datensatz ds,
			String... tags) {
		if (ds == null)
			throw new IllegalArgumentException();
		ArrayList<Feld> al = new ArrayList<Feld>();
		for (String tag : tags) {
			Feld f = ds.getFeld(tag);
			if (f != null)
				al.add(f);
		}
		return al;
	}

	public static List<Feld> extrahiereFelderAusDatensatz(
			Datensatz ds,
			int... tags) {
		return extrahiereFelderAusDatensatz(ds, ints2strings(tags));
	}

	public static Collection<Feld> extrahiereAlleFelderAusDatensatz(
			Datensatz ds) {
		return ds.getFelder().values();
	}

	

	

}
